home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------*
- * etos.c = EUC --> SJIS Ver. 2.4 L. 00 *
- * *
- * MS-DOS (or UNIX) *
- * *
- * MS-C Ver. 6.00 *
- * *
- * create 1989.03 KU666 *
- * modify 1993.02.19 KU666 *
- * *
- *--------------------------------------------------------------------*/
- #include <stdio.h>
- #include <string.h>
- #include <process.h>
-
- #define MS_DOS 1
-
- #if MS_DOS
- #include <io.h>
- #include <dos.h>
- #endif
-
- #define LINE_MAX 65535
- #define BUFF_MAX 256
- #define PATH_MAX 80
-
- #if TC
- #define EXDEV ENOTSAM
- #endif
-
- #define OFF 0
- #define ON 1
- #define VER "2.4"
-
- unsigned char buff1[BUFF_MAX], buff2[BUFF_MAX];
- char com1[PATH_MAX], temp[PATH_MAX];
- int file_cnt;
- int not_code, /* */
- not_kana, /* EUC 漢字コード外 */
- opt_flg, /* */
- owrt_flg, /* over write flag */
- name_flg; /* */
- FILE *fp1, *fp2;
-
- void err_msg1(void);
- void para_chk(char *[]);
- void file_open(char *[]);
- void kana_cnv(int *, int *);
- void kanji_cnv(int *, int *);
- void file_mv(char *, char *);
- void err_msg2(char *[]);
-
- main (int argc, char *argv[])
- {
- unsigned i;
- static int j, k;
-
- strcpy(temp, "wk_____");
-
- if (argc == 1) {
- err_msg1();
- }
- para_chk(argv);
-
- for (file_cnt = 1+opt_flg; file_cnt < argc; file_cnt++) {
-
- file_open(argv);
-
- for (i = 0; i < LINE_MAX; i++) {
- if (NULL == fgets (buff1, BUFF_MAX, fp1)) {
- break;
- }
- for (j = 0, k = 0; j < BUFF_MAX; j++, k++) {
- buff2[k] = buff1[j];
- if (buff1[j] == (unsigned char)NULL) {
- break;
- }
- if (buff1[j] == 0x8e) { /* かな */
- kana_cnv(&j, &k);
- } else { /* 漢字 */
- kanji_cnv(&j, &k);
- }
- }
- fputs(buff2, fp2); /* write file */
- }
-
- fclose(fp1);
- if (opt_flg == ON) {
- fclose(fp2);
- }
-
- if (owrt_flg == 1) { /* file delete */
- printf("file name = %s\n", argv[file_cnt]);
- file_mv(temp, argv[file_cnt]); /* file mv */
- }
- err_msg2(argv); /* error messge */
- }
- return (0);
- }
-
- void para_chk(char *argv[])
- {
- opt_flg = owrt_flg = name_flg = OFF;
-
- if (argv[1][0] == '-') {
- opt_flg = ON;
- if (argv[1][1] == 'd') {
- owrt_flg = ON;
- } else if (argv[1][1] == 'D') {
- name_flg = ON;
- } else {
- err_msg1();
- }
- }
- }
-
- void file_open(char *argv[])
- {
- int i;
- char fname[64];
-
- if (NULL == (fp1 = fopen(argv[file_cnt], "r"))) {
- printf("\n Cannot Open File(1) : %s\n\n", argv[file_cnt]);
- exit(1);
- }
- if (owrt_flg == ON) { /* -d オプション */
- if (NULL == (fp2 = fopen (temp, "w"))) {
- printf("\n Cannot Open File(2) : %s(%s)\n\n", temp, argv[file_cnt]);
- exit(1);
- }
- } else {
- strcpy(fname, argv[file_cnt+1]);
- if (name_flg == ON) { /* -D オプション */
- strcpy(fname, argv[file_cnt]);
- for (i = 0; ; i++) {
- if (fname[i] == '.') {
- strncpy(&fname[i+1], "sji", 4);
- break;
- } else if (fname[i] == (char)NULL) {
- strncpy(&fname[i], ".sji", 5);
- break;
- }
- }
- printf("output file name = %s\n",fname);
- if (NULL == (fp2 = fopen (fname, "w"))) {
- printf("\n Cannot Open File(3) : %s\n\n", fname);
- exit(1);
- }
- } else {
- fp2 = stdout;
- }
- }
- }
-
- void kana_cnv(int *cnt1, int *cnt2)
- {
- if (buff1[(*cnt1)+1] >= 0xa0 && buff1[(*cnt1)+1] <= 0xff) {
- if (buff1[(*cnt1)+1] >= 0xf0 && buff1[(*cnt1)+1] <= 0xff) {
- buff2[(*cnt2)+1] = buff1[(*cnt1)+1];
- (*cnt1)++, (*cnt2)++;
- not_code++;
- } else {
- buff2[*cnt2] = buff1[(*cnt1)+1];
- (*cnt1)++;
- }
- } else {
- not_kana++;
- }
- }
-
- void kanji_cnv(int *cnt1, int *cnt2)
- {
- unsigned char tmp, add_a, add_b;
-
- if (buff1[(*cnt1)] >= 0xa1) { /* 漢字コード */
- add_a = 0, add_b = 0;
- tmp = buff1[(*cnt1)] - (char)0xa0;
- add_b = buff1[(*cnt1)+1] - (char)0xa1;
- add_a = (char)((tmp/2)-1);
- if (tmp % 2 == 1) {
- buff2[(*cnt2)+1] = (char)(0x40 + add_b);
- add_a = add_a+(char)1;
- } else {
- buff2[(*cnt2)+1] = (char)0x9f + add_b;
- }
- if (buff2[(*cnt2)+1] >= 0x7f && buff2[(*cnt2)+1] <= 0x9e) {
- buff2[(*cnt2)+1] = buff2[(*cnt2)+1]+(char)1;
- }
- buff2[(*cnt2)] = (char)0x81 + add_a;
- (*cnt2)++, (*cnt1)++;
- }
- }
-
- #if MS_DOS
- void file_mv(char *old, char *new) /* MS-DOS */
- {
- int ret;
-
- ret = remove(new);
- if (ret != 0) {
- printf("remove エラー = %d\n", ret);
- }
- ret = rename(old, new);
- if (ret != 0) {
- printf("rename エラー = %d\n", ret);
- }
- }
- #endif
-
- #if UNIX
- void file_mv(char *old, char *new) /* UNIX */
- {
- unsigned int i;
- int j;
-
- if (NULL == (fp1 = fopen (old, "r"))) {
- exit(1);
- }
- if (NULL == (fp2 = fopen (new, "w"))) {
- exit(1);
- }
- for (i = 0; i < LINE_MAX; i++) {
- if (NULL == fgets (buff1, BUFF_MAX, fp1)) {
- break;
- }
- for (j = 0; j < BUFF_MAX; j++) {
- buff2[j] = buff1[j];
- }
- fputs(buff2, fp2);
- }
- fclose(fp1);
- fclose(fp2);
- sprintf(com1, "rm %s", old);
- system(com1); /* file delete */
- }
- #endif
-
- void err_msg1(void)
- {
- printf("etos (Ver. %s)\n" , VER);
- printf("Usage: etos [-d|-D] <filename>...\n");
- printf("\nEx.)\n");
- printf(" etos <filename>...\n");
- printf(" etos -d filename (Over Wriete)\n");
- printf(" etos -D filename (xxxxxxxx.sji)\n");
- exit(1);
- }
-
- void err_msg2(char *argv[]) /* error messge */
- {
- if (not_code != 0) {
- printf("\n%s : count of unconvertable code(s) = %d\n",
- argv[file_cnt], not_code);
- }
- if (not_kana != 0) {
- printf("\n%s : count of bad KANA code pair(s) = %d\n",
- argv[file_cnt], not_kana);
- }
- }
-